# 使用匿名函数计算两个数字的和
# lambda 参数列表 ： 表达式
# 场景：如果一个函数有一个返回值，并且只有一句代码，可以使用 lambda简化。

# 注意：
# - lambda表达式的参数可有可无；
# - 函数的参数在lambda表达式中完全适用。
# - lambda表达式能接收任何数量的参数但只能返回一个表达式的值。
# - 直接打印lambda表达式，输出的是此lambda的内存地址




# fn 相当于函数名
fn = lambda x, y: x + y
print(fn(1, 2))  # 输出 3
print(fn) # 输出 内存地址：<function <lambda> at 0x000001EB95ACA2A0>

fn1 = lambda z=100, *args: z + sum(args)
print(fn1(100, 200, 300, 400))  # 输出 1000

# 使用匿名函数做判断：三元运算,  a大于b则返回a 否则返回b
fn2 = lambda a,b: a if a>b else b
print(fn2) # 输出 None
print(fn2(4, 3)) #输出 4

# 需要给某个复杂的序列排序，用lambda表达式， 相当于java中 根据key 给列表中的每个对象根据某个指定的key排序
lst = [
    {'name': '张三', 'age': 20, 'sex': '男'},
    {'name': '李四', 'age': 10, 'sex': '女'},
    {'name': '王五', 'age': 30, 'sex': '男'},
]
lst.sort(key=lambda item: item['age'])
print(lst) # 输出 [{'name': '李四', 'age': 10, 'sex': '女'}, {'name': '张三', 'age': 20, 'sex': '男'}, {'name': '王五', 'age': 30, 'sex': '男'}]
lst.sort(key=lambda item:item['age'],reverse=True)
print(lst) # 输出 [{'name': '王五', 'age': 30, 'sex': '男'}, {'name': '张三', 'age': 20, 'sex': '男'}, {'name': '李四', 'age': 10, 'sex': '女'}]
